STM32 流水灯项目
项目说明
使用STM32单片机点亮流水灯的代码和之前使用的51有很大的区别。最主要的区别是这两种单片机的区别,至于核心算法思想都是一样的。使用STM32单片机的代码比骄复杂。
知识点
- 1、STM32单片机需要的代码文件很多。除了这个项目核心的代码 main.c 之外,还有很多需要加载的库函数,这些函数也是必不可少的。其中类似有StdPerich_Driver,Startup ,cmsis这三个文件夹目前是不需要更改里面存放的内容。需要更改的有APP,user这两个文件夹中存放的部分代码。
- 2、STM32单片机的每个IO口都有8种不同的输入模式,这8种模式的选择由代码来设置。分为输入和输出各4种。在这个项目中,使用到8个IO口,使用的模式为推挽式输出。
- 3、GPIO的使用,首先需要初始化,使用初始化函数GPIO_init函数,这个函数需要两个参数,第一个指定使用的GPIO组,这里是GPIOC;第二个参数是一个指向设置pin,传输速率,模式的结构体的指针。
- 4、GPIO的输出函数。共有三个函数可以设置IO口的输出。分别为set,reset,write。第一个设置管脚为1,第二个设置为0,这两个的操作范围是全部选中的IO口;而第三个是可以向51单片机对P口赋值一样的8位二进制数,一般用两位十六进制数字表示。使用前两个函数只能实现整排LED的闪烁,因为其不能实现具体的某一个管脚的控制,而是一整排所有管脚的控制。
部分代码
- 1、数据左移
void led_display() { int i = 0xfe; while(1){ GPIO_Write(GPIOC,i); delay(6000000); i = i << 1; i = i + 1; } }
- 由于是共阳的连接,所以首先需要赋初值为0xfe。之后进行左移时并不是执行的循环左移,而是在右端补0,这样做的结果类似于显示进度栏,没过一秒点亮一个灯,直到所有都点亮。而我们需要的效果是每次仅有一个灯点亮,每一次这个位置都向左/右移动一个位置。需要实现这个功能,就要在每一次左移后,系统西东给数子末端补的0加1,这样,就会熄灭本来要点亮的那个灯。
- 这段代码没没有实现循环不间断的流水灯,具体原因还未知。尝试过的几种方法理论上的没有问题的。估计是因为GPIO,或者数据左移的问题。在之前用VHDL或者JAVA写过的左移代码里,核心思想都是需要将第一位数字保存在数组里,之后通过在后置位叠加的方式移位。在VHDL中,可以很容易的对位进行操作。但是在JAVA中需要将数字使用toString方法转换成字符串后叠加。
- 数据流。第一列表示理想的状态,第二列表示近进行左移的效果。第三列表示左移后对数据进行+1操作的效果,其实第三列就是理想效果,即数据和第一列一样。
i= | << | << + +1 |
---|---|---|
1111 1110 | 1111 1110 | 1111 1110 |
1111 1101 | 1111 1100 | 1111 1101 |
1111 1011 | 1111 1000 | 1111 1011 |
1111 0111 | 1111 0000 | 1111 0111 |
1110 1111 | 1110 0000 | 1110 1111 |
1101 1111 | 1100 0000 | 1101 1111 |
1011 1111 | 1000 0000 | 1011 1111 |
0111 1111 | 0000 0000 | 0111 1111 |